﻿using LibNiconico.NiconicoApi.Videos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibNiconico.NiconicoApi.Videos.Comments
{
    
    /// <summary>
    /// ニコニコ動画コメントクライアント切断イベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientCloseHandler(NicoVideoCommentClientCloseEventArgs args);

  

    /// <summary>
    /// ニコニコ動画コメントクライアント読取例外イベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientReadExceptionHandler(NicoVideoCommentClientReadExceptionEventArgs args);

    /// <summary>
    /// ニコニコ動画コメントクライアントチャット結果イベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientChatResultHandler(NicoVideoCommentClienChatResultEventArgs args);

    /// <summary>
    /// ニコニコ動画コメントクライアントチャットイベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientChatHandler(NicoVideoCommentClientChatEventArgs args);

    /// <summary>
    /// ニコニコ動画コメントクライアントスレッドコメントイベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientThreadCommentHandler(NicoVideoCommentClientThreadCommentEventArgs args);

    /// <summary>
    /// ニコニコ動画コメントクライアントViewCounterイベントハンドラ
    /// </summary>
    /// <param name="args"></param>
    public delegate void NicoVideoCommentClientViewCounterHandler(NicoVideoCommentClientViewCounterEventArgs args);

    /// <summary>
    /// ニコニコ動画コメントクライアントイベント引数ベースクラス
    /// </summary>
    public abstract class NicoVideoCommentClientEventArgsBase:EventArgs
    {
        /// <summary>
        /// コメントクライアント
        /// </summary>
        public INicoVideoCommentClient Client { get; internal set; }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        internal protected NicoVideoCommentClientEventArgsBase(INicoVideoCommentClient client)
        {
            this.Client = client;
        }
    }

    /// <summary>
    /// ニコニコ動画コメントクライアント切断イベント引数
    /// </summary>
    public sealed class NicoVideoCommentClientCloseEventArgs:NicoVideoCommentClientEventArgsBase
    {

        /// <summary>
        /// 切断理由
        /// </summary>
        public string Reason { get;internal set; }

        /// <summary>
        /// 切断の原因となった例外
        /// </summary>
        public Exception Exception { get;internal set; }

        internal NicoVideoCommentClientCloseEventArgs(INicoVideoCommentClient client, Exception e, string reason)
            : base(client)
        {
            this.Reason = reason;
            this.Exception = e;
        }
    }



    /// <summary>
    /// ニコニコ動画コメントクライアント読取例外イベント引数
    /// </summary>
    public sealed class NicoVideoCommentClientReadExceptionEventArgs : NicoVideoCommentClientEventArgsBase
    {
        /// <summary>
        /// 読取時に発生した例外
        /// </summary>
        public Exception Exception { get; internal set; }

        internal NicoVideoCommentClientReadExceptionEventArgs(INicoVideoCommentClient client, Exception exception)
            : base(client)
        {
            Exception = exception;
        }

    }

    /// <summary>
    /// ニコニコ動画コメントクライアントチャット送信結果イベント引数
    /// </summary>
    public sealed class NicoVideoCommentClienChatResultEventArgs : NicoVideoCommentClientEventArgsBase
    {

        /// <summary>
        /// 送信結果
        /// </summary>
        public NicoVideoChatResultComment ChatResult { get; internal set; }

        internal NicoVideoCommentClienChatResultEventArgs(INicoVideoCommentClient client, NicoVideoChatResultComment chatResult)
            : base(client) 
        {
            this.ChatResult = chatResult;
        }

    }

    /// <summary>
    /// ニコニコ動画コメントクライアントチャットコメント受信イベント引数
    /// </summary>
    public sealed class NicoVideoCommentClientChatEventArgs : NicoVideoCommentClientEventArgsBase
    {
        /// <summary>
        /// 受信したチャットコメント
        /// </summary>
        public ICollection<NicoVideoChatComment> ChatComments { get; internal set; }

        internal NicoVideoCommentClientChatEventArgs(INicoVideoCommentClient client, ICollection<NicoVideoChatComment> chatcomments)
            : base(client)
        {
            this.ChatComments = chatcomments;
        }

    }

    /// <summary>
    /// ニコニコ動画コメントクライアントスレッドコメントイベント引数
    /// </summary>
    public sealed class NicoVideoCommentClientThreadCommentEventArgs : NicoVideoCommentClientEventArgsBase
    {
        /// <summary>
        /// 受信したスレッドコメント
        /// </summary>
        public NicoVideoThreadComment ThreadComment { get; internal set; }

        internal NicoVideoCommentClientThreadCommentEventArgs(INicoVideoCommentClient client, NicoVideoThreadComment threadComment)
            : base(client)
        {
            this.ThreadComment = threadComment;
        }
    }

    /// <summary>
    /// ニコニコ動画コメントクライアントViewCounterイベント引数
    /// </summary>
    public sealed class NicoVideoCommentClientViewCounterEventArgs : NicoVideoCommentClientEventArgsBase
    {
        /// <summary>
        /// ID
        /// </summary>
        public string Id { get; internal set; }

        /// <summary>
        /// 動画
        /// </summary>
        public string Video { get; internal set; }

        /// <summary>
        /// マイリスト
        /// </summary>
        public int MyList { get; internal set; }


        internal NicoVideoCommentClientViewCounterEventArgs(INicoVideoCommentClient client, string id, string video, int mylist)
            : base(client)
        {
            Video = video;
            Id = id;
            MyList = mylist;
        }
    }
    
}
